(* DONT_TOUCH = "TRUE" *)
module pcl7152_top (
    input clk,           // FPGA 50MHz
    input rst_n,  
    // PCL7152 IO 接口
    output scl,  //4 Y8 。
    inout  sda,  //6 AB8 。
    (* mark_debug="true" *) input CLK_TX,        // 来自 PCL7152 输出时钟 10 U7。
    (* mark_debug="true" *) input CNT_VLD,     // 8 V7。
    (* mark_debug="true" *) input [7:0] pixel_so_in,      // 并行输出 [7:0]
    //3 5 7 9 11 13 15 17 
    //Y7 AA8 AB6 AB7 V8 W9 N13 P14
    input TRIGGER, //12 Y9 。
    output CHIP_EN, //18 R14 。
    output CLK_OUT, //20 R16 。
    output CI_CTRL, //14 V9 。输出0即可，接地
    input INT, //16 N14。

    //bram控制
    output bram_clk,
    output [11:0] datin_bram_w_addr,
    output [7:0] datin_bram_w_data,
    output datin_bram_w_en,
    output datin_bram_w_we,
    //ecc控制
    output busy,
    output [7:0] error_cnt,
    output error_rst

);
// I2C 信号
wire i2c_exec;
wire bit_ctrl;
wire i2c_rh_wl;
wire [7:0] i2c_addr;
wire [7:0] i2c_data_w;
wire i2c_done;
wire i2c_ack;
wire [7:0] i2c_data_r;
wire dri_clk;

// 初始化完成标志
wire init_done;

assign CHIP_EN = 1'b1; // 默认使能芯片
assign CI_CTRL = 1'b0; // 默认输出0

wire clk_100m;
wire clk_12_5m;
wire clk_200m;
wire locked;
assign CLK_OUT = clk_12_5m; // 输出12.5MHz时钟

  pcl7152_clk_wiz u_pcl7152_clk_wiz
   (
    // Clock out ports
    .clk_out1(clk_100m),     // output clk_out1
    .clk_out2(clk_12_5m),     // output clk_out2
    .clk_out3(clk_200m),
    // Status and control signals
    .resetn(rst_n), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk)      // input clk_in1
);

assign bram_clk = clk_200m;
wire [5:0] index;
wire [2:0] state;
// 例化初始化模块
pcl7152_init_ctrl_auto u_pcl7152_init_ctrl_auto (
    .clk(dri_clk),
    .rst_n(rst_n),
    .init_done(init_done),
    .i2c_exec(i2c_exec),
    .bit_ctrl(bit_ctrl),
    .i2c_rh_wl(i2c_rh_wl),
    .i2c_addr(i2c_addr),
    .i2c_data_w(i2c_data_w),
    .i2c_done(i2c_done),
    .i2c_ack(i2c_ack),
    .index(index),
    .state(state)
);


wire [7:0] cur_state;
i2c_dri #(
    .SLAVE_ADDR(7'h2c), // 默认PCL7152地址 0x2C
    .CLK_FREQ(100_000_000),
    .I2C_FREQ(100_000)
) u_i2c_dri (
    .clk(clk_100m),
    .rst_n(rst_n),
    .i2c_exec(i2c_exec),
    .bit_ctrl(bit_ctrl),
    .i2c_rh_wl(i2c_rh_wl),
    .i2c_addr(i2c_addr),
    .i2c_data_w(i2c_data_w),
    .i2c_data_r(i2c_data_r),
    .i2c_done(i2c_done),
    .i2c_ack(i2c_ack),
    .scl(scl),
    .sda(sda),
    .dri_clk(dri_clk),
    .cur_state(cur_state)
);

bram_ecc_control #(

)u_bram_ecc_control (
    .clk_200m(clk_200m),
    .rst_n(rst_n),

    // spad信号
    .clk_tx(CLK_TX),
    .cnt_vld(CNT_VLD),
    .pixel_in(pixel_so_in), // spad输入像素数据[7:0]

    // bram 写入信号
    .datin_bram_w_addr(datin_bram_w_addr), //[bram_addr_width - 1 : 0]
    .datin_bram_w_data(datin_bram_w_data), //[7:0]
    .datin_bram_w_en(datin_bram_w_en),
    .datin_bram_w_we(datin_bram_w_we),

    // 状态信号
    .busy(busy),
    .error_cnt(error_cnt), //[7:0]
    .error_rst(error_rst)
);

endmodule
